use std::env;

/// `dev_unwrap!`
///
/// - Debug 构建：直接 `expect`，方便调试时尽早暴露问题。
/// - Release 构建：打印警告并返回提供的后备值，避免整个程序崩溃。
macro_rules! dev_unwrap {
    ($expr:expr, $fallback:expr, $msg:expr $(,)?) => {{
        #[cfg(debug_assertions)]
        {
            $expr.expect($msg)
        }
        #[cfg(not(debug_assertions))]
        {
            match $expr {
                Ok(value) => value,
                Err(err) => {
                    eprintln!("WARN: {}: {}", $msg, err);
                    $fallback
                }
            }
        }
    }};
}

/// 模拟读取必须配置：Debug 下缺失就 panic，Release 下给默认值。
fn load_secret() -> String {
    dev_unwrap!(
        env::var("APP_SECRET"),
        "release-default-secret".to_string(),
        "APP_SECRET must be set"
    )
}

/// 模拟解析端口：Debug 下非法就 panic，Release 下给默认端口。
fn load_port() -> u16 {
    let raw_port = dev_unwrap!(
        env::var("APP_PORT"),
        "8080".to_string(),
        "APP_PORT must be set"
    );

    dev_unwrap!(
        raw_port.parse::<u16>(),
        8080,
        "APP_PORT must be a valid u16"
    )
}

fn main() {
    let secret = load_secret();
    let port = load_port();

    println!("Using secret: {}", secret);
    println!("Listening on port: {}", port);
}
